package com.heima;

import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC API 详解：Statement
 */

public class JDBC_API_Statement {
    /**
     * 执行DML语句：对数据的增删改语句
     */
    @Test
    public void uodate() throws Exception {
        //Class.forName("com.mysql.jdbc.Driver");

        //2.获取MySQL连接：
        String url="jdbc:mysql:///user?useSSL=false";
        String username="root";
        String password="18307096730..";
        Connection conn = DriverManager.getConnection(url, username, password);


        String sql1="update teacher set grade ='60' where id=1";
        Statement stmt = conn.createStatement();
        String sql2="update teacher set grade ='60' where id=2";
        Statement stmt2 = conn.createStatement();

        try {
            //在执行sql之前开始事务      java里面使用try catch来处理事务提交
            conn.setAutoCommit(false);//false表示关闭自动提交，开始事务
            //执行第一个sql
            int line1 = stmt.executeUpdate(sql1);
            System.out.println(line1);
            //制造错误：此时第一个sql执行成功，但是第二个执行石板，此时两个sql都回滚，不改变数据库的值
            //int a=10/0;
            //要是不使用事务管理，则第一个sql会对数据库进行修改，第二个不会

            //执行第二个sql
            int line2 = stmt2.executeUpdate(sql2);//执行完DML语句以后，受影响的行数
            System.out.println(line2);

            //如果没有错误异常就提交事务
            conn.commit();
        } catch (Exception e) {
            //出现异常，回滚事务
            conn.rollback();
            e.printStackTrace();

        }

        //7.关闭管道资源
        stmt.close();
        conn.close();

}

    /**
     * 执行DDL语句：对数据库和表的操作
     * 创建一个新的数据库db2
     */
    @Test
    public void query() throws Exception {
        //Class.forName("com.mysql.jdbc.Driver");

        //2.获取MySQL连接：
        String url="jdbc:mysql:///user?useSSL=false";
        String username="root";
        String password="18307096730..";
        Connection conn = DriverManager.getConnection(url, username, password);


        String sql1="drop database db2";
        Statement stmt = conn.createStatement();

        try {
            conn.setAutoCommit(false);
            //执行第一个sql
            int line1 = stmt.executeUpdate(sql1);//执行DDL语句的时候，有时候返回的值是0，删除数据库返回的就是0
            //所以此时不能用返回值来判断是否执行成功
            if(line1>0){
                System.out.println("修改成功！");
            }else{
                System.out.println("sql执行错误");
            }



            //如果没有错误异常就提交事务
            conn.commit();
        } catch (Exception e) {
            //出现异常，回滚事务
            conn.rollback();
            e.printStackTrace();

        }

        //7.关闭管道资源
        stmt.close();
        conn.close();

    }


}
